<!doctype html>
<html lang="en">

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  
  <meta name="generator" content="Hugo 0.98.0" />

  
  <meta name="description" content="走在通往幸福的路上">
  

  
  <link rel="apple-touch-icon" sizes="180x180" href="https://blog.v5u.win/apple-touch-icon.png">

  
  <link rel="icon" type="image/png" sizes="32x32" href="https://blog.v5u.win/favicon-32x32.png">

  
  <link rel="icon" type="image/png" sizes="16x16" href="https://blog.v5u.win/favicon-16x16.png">

  
  <link rel="manifest" href="https://blog.v5u.win/site.webmanifest">

  
  <link rel="mask-icon" href="https://blog.v5u.win/safari-pinned-tab.svg" color="">

  <meta name="msapplication-TileColor" content="">

  <meta name="theme-color" content="">

  
  <link rel="stylesheet" href="https://blog.v5u.win/css/bootstrap.min.css" />

  
  <title>Go-流程控制 | 为吾优</title>
  

  <style>
body {
  min-width: 300px;
}

.custom-navbar {
  margin-bottom: 1em;
  height: 60px;
}

.custom-navbar a {
  display: inline-block; 
  padding: 18px 0;
  margin-right: 1em; 
  font-weight: bold; 
}

.custom-navbar a:hover,
.custom-navbar a:focus {
  text-decoration: none; 
}

@media print {
  .custom-navbar {
    display: none;
  }
}

article {
  padding-bottom: 1em;
}

img {
  max-width: 100%;
}


body {
  background-color: #fff;
}



body {
  color: #212529;
}



a {
  color: #007bff;
}



a:hover,
a:focus {
  color: #0056b3;
}



.custom-navbar {
  background-color: #212529;
}



.custom-navbar a {
  color: rgba(255,255,255,.75);
}



.custom-navbar a:hover,
.custom-navbar a:focus {
  color: rgba(255,255,255,1);
}



.container {
  max-width: 800px;
}





</style>
</head>

<body>
  <nav class="custom-navbar">
  <div class="container">
    
    <a href="/">文章</a>
    
    <a href="/tags/">标签</a>
    
    <a href="/about/">关于</a>
    
    <a href="/index.xml">RSS</a>
    
  </div>
</nav>
  
  <div class="container">
    <article>
      <h1>Go-流程控制</h1>
<p>[TOC]</p>
<h2 id="if">if</h2>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p><strong>标识符的重声明和标识符的遮蔽</strong></p>
<p>上述代码被执行完毕之后，第二次声明的<code>number</code>变量的值会是<code>7</code>，而第一次声明的<code>number</code>变量的值仍会是``。</p>
<p>switch</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h2 id="for语句">for语句</h2>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>最后，我们来说一下<code>break</code>语句和<code>continue</code>语句。它们都可以被放置在<code>for</code>语句的代码块中。break被执行时会使其所属的<code>for</code>语句的执行立即结束，continue被执行时会使当次迭代被中止（当次迭代的后续语句会被忽略）而直接进入到下一次迭代。</p>
<h2 id="select语句">select语句</h2>
<p><code>select</code>语句属于条件分支流程控制方法，不过它只能用于通道。它可以包含若干条<code>case</code>语句，并根据条件选择其中的一个执行。进一步说，<code>select</code>语句中的<code>case</code>关键字只能后跟用于通道的发送操作的表达式以及接收操作的表达式或语句。</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>如果该<code>select</code>语句被执行时通道<code>ch1</code>和<code>ch2</code>中都没有任何数据，那么肯定只有<code>default case</code>会被执行。但是，只要有一个通道在当时有数据就不会轮到<code>default case</code>执行了。显然，对于包含通道接收操作的<code>case</code>来讲，其执行条件就是通道中存在数据（或者说通道未空）。如果在当时有数据的通道多于一个，那么Go语言会通过一种伪随机的算法来决定哪一个<code>case</code>将被执行。</p>
<p>我们一直在说<code>case</code>执行条件的满足与否取决于其操作的通道在当时的状态。这里特别强调一点，即：未被初始化的通道会使操作它的<code>case</code>永远满足不了执行条件。对于针对它的发送操作和接收操作来说都是如此。</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<h2 id="defer语句-dɪˈfɚ-推迟">defer语句 [dɪˈfɚ] 推迟</h2>
<p><code>defer</code>语句仅能被放置在函数或方法中。它由关键字<code>defer</code>和一个调用表达式组成。注意，这里的调用表达式所表示的既不能是对Go语言内建函数的调用也不能是对Go语言标准库代码包<code>unsafe</code>中的那些函数的调用。</p>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<p>注意，当这条<code>defer</code>语句被执行的时候，其中的这条表达式语句并不会被立即执行。它的确切的执行时机是在其所属的函数（这里是<code>readFile</code>）的执行即将结束的那个时刻。也就是说，在<code>readFile</code>函数真正结束执行的前一刻，<code>file.Close()</code>才会被执行。</p>
<p>注意，当一个函数中存在多个<code>defer</code>语句时，它们携带的表达式语句的执行顺序一定是它们的出现顺序的倒序。</p>
<p>最后，对于<code>defer</code>语句，我还有两个特别提示：</p>
<ol>
<li><code>defer</code>携带的表达式语句代表的是对某个函数或方法的调用。这个调用可能会有参数传入，比如：<code>fmt.Print(i + 1)</code>。如果代表传入参数的是一个表达式，那么在<code>defer</code>语句被执行的时候该表达式就会被求值了。注意，这与被携带的表达式语句的执行时机是不同的。</li>
<li>如果defer携带的表达式语句代表的是对匿名函数的调用，那么我们就一定要非常警惕。正确的用法是：把要使用的外部变量作为参数传入到匿名函数中。</li>
</ol>
<!-- raw HTML omitted -->
<!-- raw HTML omitted -->
<blockquote>
</blockquote>

    </article>
  </div>

  
  
  

  
</body>

</html>